package com.siwei.mes.mapper.experiment;

import com.siwei.mes.common.base.BaseMapper;
import com.siwei.mes.entity.dto.SupplierCompanyMaterialsSelfSupplyDto;
import com.siwei.mes.entity.experiment.Experiment;
import com.siwei.mes.entity.vo.ExperimentBatchVo;
import com.siwei.mes.entity.vo.ExperimentPrintVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 试验台账(Experiment)表数据库访问层
 *
 * @author linzi
 * @since 2023-12-18 22:11:48
 */
public interface ExperimentMapper extends BaseMapper<Experiment> {
    /**
     * 获取所有
     *
     * @param entity
     * @return
     */
    List<Experiment> getList(Experiment entity);

    //查询混凝土抗压委托时间倒序 倒数两条数据及协会关联数据
    List<Experiment> getHntKyExperiment();

    //查询混凝土抗渗委托时间倒序 倒数两条数据及协会关联数据
    List<Experiment> getHntKsExperiment();

    /**
     * 根据id获取
     *
     * @param id
     * @return
     */
    Experiment loadById(@Param("id") Long id);


    //根据id获取台账和用户信息
    Experiment findExperimentById(@Param("id") Long id);

    void updateSampleNo(Experiment entity);

    void updateSampleLevelByMaterialsId(Experiment experiment);

    void updateSampleLevelBySpecId(Experiment experiment);

    /**
     * 修改仪器设备名称
     *
     * @param experimentType 试验台账类型
     * @param equipmentName  仪器设备名称
     */
    void updateEquipmentInfo(@Param("experimentType") Integer experimentType, @Param("equipmentName") String equipmentName);

    /**
     * 批量修改实验台帐批次
     *
     * @param vo 试验台账
     */
    void updateBatchByIds(ExperimentBatchVo vo);

    /**
     * 根据配合中 材料名称+材料规格+材料类型 获取任务单的计划时间之前最近的一条
     *
     * @param clmc     材料名称
     * @param clgg     材料规格
     * @param cllx     材料类型
     * @param planTime 任务单计划时间
     * @return
     */
    Long getLastExperimentId(@Param("clmc") String clmc, @Param("clgg") String clgg, @Param("cllx") String cllx, @Param("planTime") Date planTime);

    /**
     * 根据配合中 材料名称+材料规格+材料类型 获取任务单的计划时间之前最近的一条
     *
     * @param experimentPrintVo 材料名称
     * @return
     */
    Experiment getLastExperimentIdNotSelfSupply(ExperimentPrintVo experimentPrintVo);

    /**
     * 根据配合中 材料名称+材料规格+材料类型 获取任务单的计划时间之前最近的一条
     *
     * @param experimentPrintVo 材料名称
     * @return
     */
    Experiment getLastExperimentIdByFactoryAndSupplyCompanyName(ExperimentPrintVo experimentPrintVo);

    /**
     * 根据配合中 材料名称+材料规格+材料类型 获取任务单的计划时间之前最近的一条
     *
     * @param experimentPrintVo 材料名称
     * @return
     */
    Experiment getLastExperimentIdByFactory(ExperimentPrintVo experimentPrintVo);


    /**
     * 根据条件统计实验台账
     *
     * @param entity
     * @return
     */
    int countExperiment(Experiment entity);

    /**
     * 获取最近一次的试验委托信息
     *
     * @param clmc          材料名称
     * @param clgg          材料规格
     * @param materialsType 材料类型 1-水泥 2-粉煤灰 3-矿渣粉 4-粗骨料 5-细骨料 6-外加剂 7-混凝土
     * @param factory       生产厂家
     * @param planTime      最近委托时间
     * @return
     */
    Experiment getLastExperimentInfo(@Param("clmc") String clmc, @Param("clgg") String clgg, @Param("materialsType") Integer materialsType, @Param("factory") String factory, @Param("planTime") Date planTime);

    /**
     * 获取最近一次的试验委托信息 且物料甲供等于否
     *
     * @param clmc          材料名称
     * @param clgg          材料规格
     * @param materialsType 材料类型 1-水泥 2-粉煤灰 3-矿渣粉 4-粗骨料 5-细骨料 6-外加剂 7-混凝土
     * @param planTime      最近委托时间
     * @return
     */
    Experiment getLastExperimentInfoNotFactory(@Param("clmc") String clmc, @Param("clgg") String clgg, @Param("materialsType") Integer materialsType, @Param("planTime") Date planTime);

    /**
     * 查询所有物料名称和物料规格都为空的试验台账
     *
     * @return
     */
    List<Experiment> getListMaterialsIsNull();

    /**
     * 根据生产厂商修改所有生产厂商简称
     */
    void updateExperimentFactoryCalled();

    /**
     * 查询所有物料名称和物料规格都为空的试验台账
     *
     * @return
     */
    List<Experiment> getListReportNoIsNull();

    /**
     * 根据试验委托编号查询
     *
     * @param experimentNo 试验委托编号
     * @return
     */
    Experiment selectByExperimentNo(@Param("experimentNo") String experimentNo);

    /**
     * 批量修改实验台帐批次
     *
     * @param experiment 试验台账
     */
    void updateBatchReportByConsignId(Experiment experiment);

    /**
     * 批量修改实验台帐批次
     *
     * @param experimentIdList 试验台账id数组
     */
    Date getMaxExperimentEntrustTime(@Param("experimentIdList") List<Long> experimentIdList);

    /**
     * 批量修改实验台帐批次
     *
     * @param experimentIdList 试验台账id数组
     */
    Date getMaxExperimentReportDate(@Param("experimentIdList") List<Long> experimentIdList);

    /**
     * 批量修改实验台帐 是否甲供
     *
     * @param dto 试验台账
     */
    void updateBatchReportBySelfSupply(SupplierCompanyMaterialsSelfSupplyDto dto);

    /**
     * @param materialsId
     */
    List<Long> getExperimentIdByMaterialsId(@Param("materialsId") Long materialsId);

    /**
     * 原材料试验台账 根据类型获取最后一个样品编号
     *
     * @param experimentType
     */
    String getLastExperimentByType(@Param("experimentType") Integer experimentType);

    /**
     * 混凝土试验台账 根据类型获取最后一个样品编号
     *
     * @param entrustExperiment
     */
    String getLastExperimentByTypeConcrete(@Param("entrustExperiment") String entrustExperiment);

    /**
     * 更新试验台账是否新任务
     *
     * @param experimentId 试验台账id
     * @param isNewTask    是否新任务  1-有 0-没有
     */
    void updateIsNewTask(@Param("experimentId") Long experimentId, @Param("isNewTask") int isNewTask);
}
